package com.ezgo.erc.master.utils;

import javax.xml.namespace.QName;

import org.apache.axis2.AxisFault;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.rpc.client.RPCServiceClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 
 * (工具)模块 TODO(AXIS2工具类)
 * 
 * @author devintam
 * @date 2015年7月17日 下午2:32:17
 *
 */
@SuppressWarnings({ "unchecked", "rawtypes" })
public class Axis2Util {

	private static Logger logger = LoggerFactory.getLogger(Axis2Util.class);

	/**
	 * 
	 * TODO(RPC客户端)
	 *
	 * @param wsdlUrl
	 *            webservice访问地址
	 * @param targetNameUrl
	 *            命名空间地址
	 * @param methodName
	 *            方法名称
	 * @param params
	 *            输入参数对象 可为 new Object[]{}
	 * @param cls
	 *            输出参数对象 可为空
	 * @return T
	 */
	public static final <T> T getAxis2ReturnData(String wsdlUrl,
			String targetNameUrl, String methodName, Object[] params,
			Class<?>[] cls) {
		try {
			// 使用RPC方式调用WebService
			RPCServiceClient serviceClient = new RPCServiceClient();
			Options options = serviceClient.getOptions();
			// 指定调用WebService的URL
			EndpointReference targetEPR = new EndpointReference(wsdlUrl);
			// 设置命令空间地址、方法名称
			QName op = new QName(targetNameUrl, methodName);
			options.setTo(targetEPR);
			if (cls != null)
				return (T) (serviceClient.invokeBlocking(op, params, cls))[0];
			else {
				serviceClient.invokeRobust(op, params);
				return (T) new Message("200", "操作成功");
			}
		} catch (AxisFault e) {
			logger.error(String.format(Constants.EX_FORMAT_STR,
					Axis2Util.class.getName(), e.getMessage()));
			return null;
		}
	}

}
